package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

//三数和为0
func main() {
	reader := bufio.NewReader(os.Stdin)
    var s_arr string
    var N int
	line,_ := reader.ReadString('\n')
	lines := strings.Split(line,",")
	s_arr = lines[0]
	s_N := strings.Trim(lines[1],"\n")
	N,_ = strconv.Atoi(s_N)
	// fmt.Println(lines[1])
    // fmt.Scanf("%s,%d",&s_arr,&N)
    arr_s := strings.Split(s_arr," ")
	nums := []int{}
	for i:=0;i<len(arr_s);i++{
		num,_ := strconv.Atoi(arr_s[i])
		nums = append(nums, num)
	}
	// fmt.Println(nums,N)
	//判
	if threeSum(nums,N) {
		fmt.Println("True")
	}else{
		fmt.Println("False")
	}
}
func threeSum(nums []int,target int) bool {
    n := len(nums)
    sort.Ints(nums)
    // ans := make([][]int, 0)
	if nums[0] > target {
		return false
	}
    // 枚举 a
	t := target  //备份
    for first := 0; first < n; first++ {
        // 需要和上一次枚举的数不相同
        if first > 0 && nums[first] == nums[first - 1] {
            continue
        }
        // c 对应的指针初始指向数组的最右端
        third := n - 1
        // target := -1 * nums[first]
		target = t - nums[first]
        // 枚举 b
        for second := first + 1; second < n; second++ {
            // 需要和上一次枚举的数不相同
            if second > first + 1 && nums[second] == nums[second - 1] {
                continue
            }
            // 需要保证 b 的指针在 c 的指针的左侧
            for second < third && nums[second] + nums[third] > target {
                third--
            }
            // 如果指针重合，随着 b 后续的增加
            // 就不会有满足 a+b+c=0 并且 b<c 的 c 了，可以退出循环
            if second == third {
                break
            }
            if nums[second] + nums[third] == target {
                // ans = append(ans, []int{nums[first], nums[second], nums[third]})
				// fmt.Println(nums[first],nums[second],nums[third])
				return true
            }
        }
    }
    return false
}